package xin.fsqr520.project.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;
import xin.fsqr520.project.domain.constants.MessageConstant;
import xin.fsqr520.project.domain.po.User;
import xin.fsqr520.project.domain.po.UserMessage;
import xin.fsqr520.project.domain.vo.Result;
import xin.fsqr520.project.mapper.UserMapper;
import xin.fsqr520.project.service.IUserService;
import xin.fsqr520.project.util.EncodingUtil;
import xin.fsqr520.project.util.RedisStringUtil;
import xin.fsqr520.project.util.SendMessage;
import xin.fsqr520.project.util.VerificationCodeUtil;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 用户控制器，处理用户相关的HTTP请求
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private IUserService userService;

    @Resource
    private RedisStringUtil redisStringUtil;

    @Resource
    private UserMapper userMapper;

    /**
     * 根据手机号初始用户信息
     */
    @PutMapping("/updateBasicInfo1")
    public Result<?> getBasicInfo1(@RequestBody UserMessage userMessage

    ) {
        User user = new User();
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper
                .eq(User::getPhoneNumber, userMessage.getPhoneNumber());
        user = userMapper.selectOne(userLambdaQueryWrapper);
        if (user == null)
            return Result.error("用户不存在,修改失败");

        user.setAvatar(userMessage.getAvatar_url());
        if (userMessage.getGender().equals("男生"))
            user.setSex(1);
        else if (userMessage.getGender().equals("女生"))
            user.setSex(2);
        else
            user.setSex(0);
        user.setGrade(userMessage.getGrade());
        user.setSpecialty(userMessage.getMajor());
        user.setUsername(userMessage.getNickname());
        int i = userMapper.updateById(user);
        if (i == 1) return Result.success(user);
        return Result.error("修改失败");
    }


    /**
     * 根据userid获取 头像 性别 昵称 学习 年级 专业 真实姓名 学号 密码
     *
     * @return
     */
    @GetMapping("/getBasicInfo")
    public Result<?> getBasicInfo(Long userId) {
        if (userId == null) return Result.error("userId不可为空");
        User user = userMapper.selectById(userId);
        if (user == null) return Result.error("未找到该用户");

        return Result.success(user);
    }

    /**
     * 根据userid修改 头像 性别 昵称 学习 年级 专业 真实姓名 学号 密码
     *
     * @return
     */
    @PutMapping("/updateBasicInfo")
    public Result<?> updateBasicInfo(@RequestBody User user) {
        int i = userMapper.updateById(user);
        if (i == 1) return Result.success("修改成功");
        return Result.error("修改失败");
    }

    /**
     * 用户登录接口
     *
     * @param loginParam 包含手机号和密码的登录参数
     * @return 登录结果，包含用户信息和token
     */
    @PostMapping("/login")
    public Result loginByPassword(@RequestBody Map<String, String> loginParam) throws Exception {
        String phoneNumber = loginParam.get("phoneNumber");
        String password = loginParam.get("password");

        // 参数校验
        if (phoneNumber == null || password == null) {
            return Result.error("手机号和密码不能为空");
        }

        // 调用Service层登录方法
        User user = userService.login(phoneNumber, password);

        if (user != null) {
            // 登录成功，生成token（示例中使用简单方式，实际项目建议使用JWT）
            Map<String, Object> result = new HashMap<>();
            user.setPassword("woyebuzhidao");
            result.put("user", user);
            result.put("token", "fuckhuawei"); // 实际项目中替换为真实token生成逻辑
            return Result.success(result);
        } else {
            // 登录失败
            return Result.error(MessageConstant.PHONENUMBER_PASSWORD_ERROR);
        }
    }

    /**
     * 用户注册接口
     *
     * @param registerParam 包含手机号、用户名和密码的注册参数
     * @return 注册结果，包含用户信息和提示消息
     */
    @PostMapping("/register")
    public Result<String> register(@RequestBody Map<String, String> registerParam) {
        // 1. 获取注册参数
        String phoneNumber = registerParam.get("phoneNumber");
        String username = registerParam.get("username");
        String password = registerParam.get("password");

        // 2. 参数校验
        if (StringUtils.isAnyBlank(phoneNumber, username, password)) {
            return Result.error("手机号、用户名和密码不能为空");
        }
        // 手机号格式校验（简单示例，可根据实际需求完善正则）
        if (!phoneNumber.matches("^1[3-9]\\d{9}$")) {
            return Result.error("请输入正确的手机号格式");
        }
        // 密码长度校验（示例：至少6位）
        if (password.length() < 6) {
            return Result.error("密码长度不能少于6位");
        }

        // 3. 业务逻辑校验
        int row = userService.register(phoneNumber, username, password);
        if (row == 1) return Result.success("注册成功");
        return Result.error("注册失败");
    }

    /**
     * 用户登录接口
     * 根据手机号获取验证码
     *
     * @return 登录结果，包含用户信息和token 此接口可用于发送验证码
     */
    @GetMapping("/login/sendcode")
    public Result<String> loginByPhoneNumber_SendCode(String phoneNumber) throws Exception {

        // 参数校验
        if (phoneNumber == null) {
            return Result.error("手机号不能为空");
        }
        // 手机号格式校验（简单示例，可根据实际需求完善正则）
        if (!phoneNumber.matches("^1[3-9]\\d{9}$")) {
            return Result.error("请输入正确的手机号格式");
        }

        //查看redis是否存在 存在就先不发
        boolean flag = redisStringUtil.exists(phoneNumber);
        if (flag) return Result.error("验证码获取频繁，请稍后再试！");

        //查看用户是否存在 存在就发验证码并设置redis
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
                .eq(User::getPhoneNumber, phoneNumber);
        long count = userService.count(wrapper);
        if (count != 1) return Result.error("手机号不存在");

        //生成验证码 存入redis  短信发送发送
        String code = VerificationCodeUtil.nextCode(6);

        int status = SendMessage.sendMessage(phoneNumber, code, 5);
        if (status == 1) {
            //应该发送成功了才存 嗯 逻辑这样才对
            redisStringUtil.setWithExpire(phoneNumber, code, 5, TimeUnit.MINUTES);
            return Result.success("验证码发送成功");
        }
        return Result.error("验证码获取失败");
    }

    /**
     * 用户登录接口
     *
     * @param loginParam 根据手机号和验证码登录
     * @return 登录结果，包含用户信息和token
     */
    @PostMapping("/login/loginBycode")
    public Result loginByPhoneNumber_Login(@RequestBody Map<String, String> loginParam) throws Exception {
        String phoneNumber = loginParam.get("phoneNumber");
        String code = loginParam.get("code");

        // 参数校验
        if (StringUtils.isAnyBlank(phoneNumber, code)) {
            return Result.error("手机号、验证码不能为空");
        }
        // 手机号格式校验（简单示例，可根据实际需求完善正则）
        if (!phoneNumber.matches("^1[3-9]\\d{9}$")) {
            return Result.error("请输入正确的手机号格式");
        }

        //查看redis是否存在
        boolean flag = redisStringUtil.exists(phoneNumber);
        if (!flag) return Result.error("验证码无效");

        String redisCode = redisStringUtil.get(phoneNumber);
        if (!redisCode.equals(code)) return Result.error("验证码错误");

        //应该吧redis的验证码删了 只能用一次这样子 也许吧
//        redisStringUtil.delete(phoneNumber);

        //验证码正确 把用户查出来
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
                .eq(User::getPhoneNumber, phoneNumber);
        User user = userService.getOne(wrapper);
        if (user == null) return Result.error("用户不存在？出错了");

        // 登录成功，生成token（示例中使用简单方式，实际项目建议使用JWT）
        Map<String, Object> result = new HashMap<>();
        user.setPassword("woyebuzhidao");
        result.put("user", user);
        result.put("token", "fuckhuawei"); // 实际项目中替换为真实token生成逻辑
        return Result.success(result);
    }
}